package gokv

import (
	"gitee.com/Cauchy_AQ/gokv/index"
	"os"
	"time"
)

const (
	DataFile1K int64 = (1 << 10) * (1 << iota) * (1 << iota)
	DataFile4K
	DataFile16K
	DataFile64K
	DataFile256K
	DataFile1M
	DataFile4M
	DataFile16M
	DataFile64M
	DataFile256M
)

// Options 项目配置结构
type Options struct {
	DirPath            string          // 数据文件目录路径
	DataFileSize       int64           // 数据文件大小
	SyncWrites         bool            // 每次写数据是否持久化
	BytesSync          uint            // 累积写入字节数执行持久化
	TimeSync           time.Duration   // 每隔一段时间执行持久化
	IndexType          index.IndexType // 索引类型
	MMapAtStartUp      bool            // 启动时使用 mmap 加载数据
	DataFileMergeRatio float32         // 无效数据 merge 的占比阈值
}

// IteratorOptions 用户索引迭代器配置结构
type IteratorOptions struct {
	Prefix  []byte // 迭代数据的 key 前缀
	Reverse bool   // 迭代的顺序
}

// WriteBatchOptions 原子批量写配置结构
type WriteBatchOptions struct {
	MaxBatchNum uint // 一个批次中最大数据量
	SyncWrites  bool // 提交时是否 Sync 持久化
}

// DefaultOptions 默认配置项
var DefaultOptions Options = Options{
	DirPath:            os.TempDir() + "/tmp-data",
	DataFileSize:       DataFile64K,
	DataFileMergeRatio: 0.2,
	SyncWrites:         false,
	BytesSync:          0,
	TimeSync:           time.Hour,
	IndexType:          index.SKIP,
	MMapAtStartUp:      true,
}

// DefaultIteratorOptions 默认迭代器配置项
var DefaultIteratorOptions IteratorOptions = IteratorOptions{
	Prefix:  nil,
	Reverse: false,
}

// DefaultWriteBatchOptions 默认批量原子写配置项
var DefaultWriteBatchOptions WriteBatchOptions = WriteBatchOptions{
	MaxBatchNum: 1024,
	SyncWrites:  false,
}
